[设计模式]之十一:适配器模式


定义

将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。

java不支持多重继承,故讨论对象适配器

UML

示例代码

// 一个美国人,说英语
public class American {
    public void sendGreetings() {
        System.out.println("Hello!");
    }
}
// 中国人说中文
public class Chinese {
    public void sendGreetings() {
        System.out.println("你好");
    }
}
// 需要一个翻译把英文翻译成中文 他就是Adapter
public class Translator extends American {
    private Chinese chinese = new Chinese();

    @Override
    public void sendGreetings() {
        //打印英文
        super.sendGreetings();
        //中文翻译
        chinese.sendGreetings();    
    }
}
// 美国人初始化为翻译,说英文翻译成中文
public static void main(String[] args) {
    // TODO Auto-generated method stub
    American target = new Translator();
    target.sendGreetings();
}
//输出
Hello!
你好

评价

优点

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
  • 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。

缺点

  • 类适配器模式的缺点如下:

    对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

  • 对象适配器模式的缺点如下:

    与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。

在以下情况下可以使用适配器模式:

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要。
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

文章作者: Wossoneri
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Wossoneri !
评论
  目录